package main

import "fmt"

//定义全局变量
var h1 = 100
var h2 = 200
var h3 = "jack"

//上面的声明方式，也可以改成一次性声明
var (
	n3 = 300
	n4 = 900
	n5 = "mary"
)

func main() {
	//golang的变量使用方式1
	//第一种：指定变量类型，声明后若不赋值，使用默认值
	//int 的默认值是0
	var i int
	fmt.Println("i=", i)

	//第二种：根据值自行判定变量类型(类型推导)
	var num = 10.11
	fmt.Println("num=", num)

	//第三种：省略var，注意:=左侧的变量不应该是已经声明过的，否则会导致编译错误
	//下面的方式等价var num string name = "tom"
	//:=的:不能省略，否则错误
	name := "tom"
	fmt.Println("name=", name)
	//-------------------------------

	//该案例演示golang如何一次性声明多个变量
	var n1, n2, n3 int
	fmt.Println("n1=", n1, "n2=", n2, "n3=", n3)

	//一次性声明多个变量的方式2
	var t1, t2, t3 = 100, "tom", 888
	fmt.Println("t1=", t1, "t2=", t2, "t3=", t3)

	//一次性声明多个变量的方式3，同样可以使用类型推导
	f1, f2, f3 := 100, "tom", 888
	fmt.Println("f1=", f1, "f2=", f2, "f3=", f3)

	//输出全局变量
	fmt.Println("f1=", f1, "f2=", f2, "f3=", f3)
	fmt.Println("n3=", n3, "n4=", n4, "n5=", n5)

	//----------------------------------------------
	//变量使用的注意事项
	//该区域的数据值可以在同一类型范围内不断变化
	var j int = 10
	j = 30
	j = 50
	fmt.Println("j=", j)
	//i=1.2 //int, 原因是不能改变数据类型

	//变量在同一作用域(在一个函数或者在代码块)内不能重名
	var h int = 59
	// h := 99 不能重名
	fmt.Println("h=", h)
}
